package com.person.providerpayment9001.utils;

import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author zhangfc
 * @description 数据库对应表的生成器
 * @data 2021-04-25 09:37:07
 */
public class MyGeneratorUtil {

    /**
     * @param tableName
     * @description 创建代码生成器 生成代码指定路径
     */
    public static void createDataBase(String[] tableName) {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();
        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        //配置输出的位置的根路径
        gc.setOutputDir("D:\\idea_project\\springcloud_test\\cloud_provider_payment9001/src/main/java")
                //配置生成代码的作者
                .setAuthor("zhangfc")
                .setOpen(false)
                //是否生成swagge2注解 true 开启 false 关闭
                .setSwagger2(true)
                //生成类的名字 %s是表名
                .setServiceName("%sService");
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        //设置数据库的ip和端口
        dsc.setUrl("jdbc:mysql://127.0.0.1:3306/test001?useSSL=false&&characterEncoding=UTF-8&characterEncoding=utf8&serverTimezone=UTC")
                //设置数据库driver
                .setDriverName("com.mysql.jdbc.Driver")
                //设置数据库帐号
                .setUsername("root")
                //设置密码
                .setPassword("root")
                //自定义表字段类型转换
                .setTypeConvert(new MySqlTypeConvert() {
                    @Override
                    public DbColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
                        //数据库中的datetime 类型默认会转换为java中的LocalDateTime 这里自定转换为Data类型
                        if (fieldType.toLowerCase().contains("datetime")) {
                            return DbColumnType.DATE;
                        }
                        return (DbColumnType) super.processTypeConvert(globalConfig, fieldType);
                    }
                });
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig().setParent("com.person").setModuleName("providerpayment9001");
        mpg.setPackageInfo(pc);
        // 自定义配置 注入自定义配置，可以在 VM 中使用 cfg.abc 【可无】
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
                this.setMap(map);
            }
        };
        // 模板是 freemarker
        String templatePath = "/templates/mapper.xml.ftl";
        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<FileOutConfig>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
                return "D:\\idea_project\\springcloud_test\\cloud_provider_payment9001/src/main/resources/mapper/"
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();
        templateConfig.setXml(null);
        mpg.setTemplate(templateConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        //表名映射到实体的生成策略 大驼峰命名
        strategy.setNaming(NamingStrategy.underline_to_camel)
                //数据库表字段映射到实体 小驼峰 未设置的话按照Naming的策略
                .setColumnNaming(NamingStrategy.underline_to_camel)
                //生成的实体是否为lombok模型(默认是false)
                .setEntityLombokModel(true)
                //生成@Restcontroller控制器
                .setRestControllerStyle(true)
                //自定义继承的Controller类全称
               // .setSuperControllerClass("com.baomidou.ant.common.BaseController")
                //执行的表名
                .setInclude(tableName)
                //驼峰转连字符
                .setControllerMappingHyphenStyle(true)
                //表前缀
                .setTablePrefix("m_");
        mpg.setStrategy(strategy)
                .setTemplateEngine(new FreemarkerTemplateEngine())
                .execute();
    }
}
